From 4483636016ec9e30ee1247b62851a66690967637 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 29 Oct 2015 01:03:09 +0100 Subject: [PATCH] widget: Queue resize on parent on show/hide When gtk_widget_show() or gtk_widget_hide() is called, don't queue a resize on the widget itself but on the parent. The widget itself may already be marked as in need of a resize and the call would be optimized out and never reach the parent. The parent size will change though because a child widget just changed its visibility. Fixes a bunch of issues with menus appearing black, toolbas not hiding in widget-factory and also various reftests. --- gtk/gtkwidget.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 764df9057f..2c03f72e01 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -4707,21 +4707,23 @@ gtk_widget_show (GtkWidget *widget) if (!_gtk_widget_get_visible (widget)) { + GtkWidget *parent; + g_object_ref (widget); gtk_widget_push_verify_invariants (widget); - if (!_gtk_widget_is_toplevel (widget)) - gtk_widget_queue_resize (widget); - - /* see comment in set_parent() for why this should and can be - * conditional - */ - if (widget->priv->need_compute_expand || - widget->priv->computed_hexpand || - widget->priv->computed_vexpand) + parent = _gtk_widget_get_parent (widget); + if (parent) { - if (widget->priv->parent != NULL) - gtk_widget_queue_compute_expand (widget->priv->parent); + gtk_widget_queue_resize (parent); + + /* see comment in set_parent() for why this should and can be + * conditional + */ + if (widget->priv->need_compute_expand || + widget->priv->computed_hexpand || + widget->priv->computed_vexpand) + gtk_widget_queue_compute_expand (parent); } gtk_css_node_set_visible (widget->priv->cssnode, TRUE); @@ -4809,6 +4811,7 @@ gtk_widget_hide (GtkWidget *widget) if (_gtk_widget_get_visible (widget)) { GtkWidget *toplevel = _gtk_widget_get_toplevel (widget); + GtkWidget *parent; g_object_ref (widget); gtk_widget_push_verify_invariants (widget); @@ -4827,10 +4830,12 @@ gtk_widget_hide (GtkWidget *widget) gtk_css_node_set_visible (widget->priv->cssnode, FALSE); g_signal_emit (widget, widget_signals[HIDE], 0); - if (!_gtk_widget_is_toplevel (widget)) - gtk_widget_queue_resize (widget); g_object_notify_by_pspec (G_OBJECT (widget), widget_props[PROP_VISIBLE]); + parent = gtk_widget_get_parent (widget); + if (parent) + gtk_widget_queue_resize (parent); + gtk_widget_pop_verify_invariants (widget); g_object_unref (widget); } -- 2.30.2